
/**
 * 插件名:锁箱子
 * 作者:Yoyo
 * QQ群:363457102
 * v0.0.2
 */
 
//数据库
const lwcDb = data.openDB(".\\plugins\\Yoyo\\lwc");



//监听事件
mc.listen("onOpenContainer",openBox);
mc.listen("onUseItemOn",UseItemOn);
mc.listen("onDestroyBlock",DestroyBlock);
mc.listen("onServerStarted",ServerStarted);



//爆炸检测
mc.listen("onExplode",(source,pos,power,range,isDestroy,isFire)=>{
    return SendExplode(pos);
});
mc.listen("onBedExplode",(pos)=>{
    return SendExplode(pos);
});
mc.listen("onRespawnAnchorExplode",(pos,player)=>{
    if(!SendExplode(pos)){
        mc.broadcast(`§4§l管理注意玩家:[ ${player.name}] 试图用重生锚炸其它玩家箱子!!已被拦截!! `);
        return false;
    }else{
        return true;
    }
    
});
//漏斗吸物品检测
mc.listen("onHopperSearchItem",(pos)=>{
    //组合成键
    var keyBlock = data.toMD5(`${pos.x}|${(pos.y+1)}|${pos.z}`);
    var selectKey = lwcDb.get(keyBlock);
    if(selectKey!=null){
        return false
    }
});

//活塞推动检测
mc.listen("onPistonPush",(pistonPos,block)=>{
    var bpos = block.pos;
    //组合成键
    var keyBlock = data.toMD5(`${bpos.x}|${bpos.y}|${bpos.z}`);
    var selectKey = lwcDb.get(keyBlock);
    if(selectKey!=null){
        return false
    }
});
//方法

//玩家打开箱子
function openBox(player,block){
    if(block.type != "minecraft:chest") return true;
    let bpos = block.pos;
    //组合成键
    var keyBlock = data.toMD5(`${bpos.x}|${bpos.y}|${bpos.z}`);
    var selectKey = lwcDb.get(keyBlock);
    if(selectKey==null) return true;//找不到不拦截
    if(selectKey.types == 0){
        if(player.xuid != selectKey.xuid){
            player.tell("§4这是别人的私有箱子,你无权操作!");
            return false;
        }
        return true;
    }else if(selectKey.types == 1){
        //密码箱子
        let PLindex = selectKey.player[player.xuid];
        if(PLindex!=null && PLindex == selectKey.password){
            return true;
        }else{
            let utws = mc.newCustomForm();
            utws.setTitle("密码箱子");
            utws.addInput("箱子密码:","请输入箱子密码");
            player.sendForm(utws,(player,data)=>{
                if(data == null) return false;
                if(data[0] != selectKey.password){
                    player.tell("§4密码错误,箱子打开失败!");
                    return false
                }
                selectKey.player[player.xuid] = data[0];
                lwcDb.set(keyBlock,selectKey);//保存密码
                player.tell("§2密码正确,已记录下次不需要输入密码了,除非密码更改!再次点击打开箱子吧!");
            });
        }
    }else if(selectKey.types == 2){
        //清空箱子
        let containerS = block.getContainer();
        containerS.removeAllItems();
        return true;
    }
    return false;
}

/*
物品:minecraft:stick
箱子:minecraft:chest*/
//玩家用木棒点击箱子
function UseItemOn(player,item,block,side){
    if(item.type != "minecraft:stick" || block.type!="minecraft:chest") return true;//不是这样就不拦截
    var bpos = block.pos;
    //组合成键
    var keyBlock = data.toMD5(`${bpos.x}|${bpos.y}|${bpos.z}`);
    var selectKey = lwcDb.get(keyBlock);
    if(selectKey!=null && player.isOP()==false && selectKey.xuid != player.xuid){
        player.tell("§4该箱子已经有主人了,你无权进行管理");
        return false;
    }else if(selectKey!=null && player.isOP()==true && selectKey.xuid != player.xuid){
        player.tell("§e即便箱子有主人,但是你是OP大哥,请为所欲为吧!!咦咦咦~~");
        //管理员管理箱子
    }else if(selectKey!=null && selectKey.xuid == player.xuid){
        //管理自己的箱子
    }else if(selectKey==null){
        //空箱子
    }else{
        //未知
        return false;
    }
    let passW = '';
    let typesa = 0;
    if(selectKey!=null){
        passW = selectKey.password;
        typesa = selectKey.types;
    }
    let utw = mc.newCustomForm();
    utw.setTitle("箱子管理");
    utw.addLabel("欢迎使用Yoyo版锁箱子哦,你可以手持木棒点击箱子打开此界面!\n[私有箱子]:只能自己打开的箱子\n[密码箱子]:所有知道密码的人都可以打开\n[垃圾回收箱子]:...放进去的物品会消失!!!所有人都可以用!");
    utw.addDropdown("箱子类型",["私有箱子","密码箱子","垃圾回收箱子"],typesa);
    utw.addInput("密码1~10位字母数字(类型为密码箱子才有用)","请输入箱子的密码",passW);
    utw.addSwitch("箱子保护状态|会删除记录",true);
    player.sendForm(utw,(player,data)=>{
        if(data==null) return false;
        if(data[3]==0){
            //删除箱子记录
            if(lwcDb.delete(keyBlock)){
                player.tell("§2箱子已经取消保护,它自由了");
            }else{
                player.tell("§4由于特殊情况,可能箱子它不想离开你.取消保护失败");
            }
        }else{
            //更新箱子记录
            let blockPos = {
                x:bpos.x,
                y:bpos.y,
                z:bpos.z,
                dimid:bpos.dimid
            }
            if(selectKey == null){
                selectKey = {
                    xuid:player.xuid,
                    types:data[1],
                    player:{},
                    pos:blockPos,
                    password:'',

                }
                if(data[1]==1){
                    if(!/^\w{1,10}$/.test(data[2])){
                        player.tell("§4箱子密码不符合规则");
                        return false;
                    }
                    selectKey.password = data[2];
                }
            }else{
                if(selectKey.pos == null){
                    selectKey.pos = blockPos;
                }
                selectKey.types = data[1];
                if(data[1]==1){
                    if(!/^\w{1,10}$/.test(data[2])){
                        player.tell("§4箱子密码不符合规则");
                        return false;
                    }
                    selectKey.password = data[2];
                }
            }
            
            if(lwcDb.set(keyBlock,selectKey)){
                player.tell("§2箱子信息更新成功");
            }else{
                player.tell("§4箱子信息更新失败,别问我为啥!我也不知道.");
            }
        }
        return false;
    });
    


    return false;
}


//玩家破坏箱子
function DestroyBlock(player,block){
    if(block.type != "minecraft:chest") return true;
    let bpos = block.pos;
    //组合成键
    var keyBlock = data.toMD5(`${bpos.x}|${bpos.y}|${bpos.z}`);
    var selectKey = lwcDb.get(keyBlock);
    if(selectKey != null){
        if(selectKey.xuid == player.xuid){
            player.tell("§e箱子已经保护了,无法破坏,用木棒打开设置,取消保护!!才可以破坏!!");
        }else{
            player.tell("§4箱子已经保护了,无法破坏!!!");
        }
        return false;
    }else{
        return true;
    }
}

//箱子旁边有炸弹爆了
function SendExplode(poss){
    var status = true;
    let auyArr = lwcDb.listKey();
    for(key in auyArr){
        var itemBoxS = lwcDb.get(auyArr[key]);
        log(itemBoxS.pos.dimid+"|"+poss.dimid);
        if(itemBoxS.pos.dimid == poss.dimid){
           var dx = itemBoxS.pos.x - poss.x;
           var dy = itemBoxS.pos.y - poss.y
           var dz = itemBoxS.pos.z - poss.z;
           var ams = (dx*dx)+(dy*dy)+(dz*dz);
           if(Math.sqrt(ams) < 7){
               log("进入拦截");
            var playerName = data.xuid2name(itemBoxS.xuid);
            colorLog("red",`[锁箱子] 为了保护箱子 帮玩家:[${playerName}]拦截了一次荷包蛋!!!`);
            var playerObj =  mc.getPlayer(itemBoxS.xuid);
            if(playerObj){
                playerObj.tell(`§e!!!卧槽有人炸你箱子了,但是我帮你保住了! 坐标在: ${parseInt(poss.x)},${parseInt(poss.y)},${parseInt(poss.z)} 快去干TA!!`);
            }
            status = false;
            break;
           }else{
               log("不在身边"+Math.sqrt(ams));
           }
        }
    }
    return status;

}

function ServerStarted(){
    log("[INFO] Yoyo版锁箱子已加载完成遇到问题 加QQ群:363457102 ");
}

